This application is a non-provisional application claiming priority under 35 U.S.C. §120 to provisional application Ser. No. 60/313,364, filed Aug. 17, 2001 of the same name and to the same inventor as the instant application.
In software development, the need often arises to add new features to an application already implemented with existing code. This is one of the most difficult tasks in software development, especially if the new features will change the execution flow of the original program. For example, in a telephone switching system, to add programs to implement the “call forwarding” feature will change the execution flow of the existing “plain old telephone service” and other features. To add such new features using existing general purpose programming languages, the programmer must modify existing code. That requires the programmer to be thoroughly familiar with the existing code and be able to trace, line by line, the different execution flows of existing code to determine where to make the changes. With existing art, this is a labor-intensive process as there is no automated tool that can help the programmer. At the end, the programmer is often left wondering whether she has correctly determined the code to be changed, whether she has found all of them and what impact her changes may have on existing functionality. It will require exhaustive testing and many trials and errors before the job is considered done.
In addition, in large-scale software development, it is often necessary to assign different programmers to develop different features of an application. Using today's general purpose programming languages such as C++ or Java, the programs of “call waiting” will require changes in the programs of “three way calling” and vice versa as these features affect each others' control flow. The programmers need to negotiate with each other thus complicating their design task. Their designs become intertwined and the resultant software obscures the logic of the individual features making them difficult to maintain. Each feature cannot be a standalone library component. They will all be loaded as a monolithic object whether the user desires all of them. Therefore, there is a need to enable programmers to design their features independently and package them as a library of components.
Later, we shall refer to programs that, when they are put together into a single executing program, one may change the execution flows of the other to be interacting programs. Alternatively, we may say one program interacts with another, or they interact with each other. Since feature programs are the programs that implement a feature, when we say two features or two feature programs interact with each other, we mean some programs of one feature interact with some programs of the other.
Using an existing general-purpose computer programming language, such as C++ or Java, a programmer must sequence the execution flows of program statements. This makes it necessary to change code when interacting feature programs must be integrated together. Furthermore, programs written in existing general-purpose languages are not easy to analyze. Presently, a tool does not exist that can help the programmer to identify where to add new feature programs into existing code.